import pandas as pd
# 用字典创建dataframe
#创建一个学生信息表
# xuehao = ['U001', 'U002', 'U003', 'U004', 'U005']
# xingming = ['张三', '李四', '王五', '小明', '小花']
# xingbie = ['男', '男', '男', '女', '女']
# nianling = [16, 18, 19, 19, 17]
# d=pd.DataFrame({'学号':xuehao,'姓名':xingming,'性别':xingbie,'年龄':nianling})
# # d1=pd.DataFrame({'学号':xuehao,'姓名':xingming,'性别':xingbie,'年龄':nianling} ,index=[1,2,3,4,5])
# print(d)   # 自定义标签
# print(d1)  #带有定义的标签

# ###获取 d里面的Values值属性
# df_v =d.values
# print(df_v)

# ####获取 d 里面的  Index 行标签
# df1 =d.index
# print(df1)        #  RangeIndex(start=0, stop=5, step=1)
# df2 =d.index.values
# print(df2)        #[0 1 2 3 4]
# ###获取列名  d.values  返回一个列名对象，  获取列名.values
# c=d.columns
# a=c.values
# print(c)
# print(a)

###修改行标签
# d.index=['a','b','c','d','e']
# print(d)

###修改列名
# d.columns=['num','name','sex','age']
# print(d)
#Dataframe  增删改查
#增 /单行      表名.loc[]   loc用标签  iloc 用下标 (注意，ilco 可以访问已经纯在的下标，不能用于增加不存在的下标)
# d.loc[5] = {'学号':'U006','姓名':'小康','性别':'男','年龄':20}
# d.loc[6] = {'学号':'U007','姓名':'小da','性别':'男','年龄':21}
# d.iloc[1] = {'学号':'U006','姓名':'小康','性别':'男','年龄':20}
#
# print(d)

###多行增加 / 二表的连接合并
###  pd.concat([表一]，[表二])
# xuehao = ['U001', 'U002', 'U003', 'U004', 'U005']
# xingming = ['张三', '李四', '王五', '小明', '小花']
# xingbie = ['男', '男', '男', '女', '女']
# nianling = [16, 18, 19, 19, 17]
# d1=pd.DataFrame({'学号':xuehao,'姓名':xingming,'性别':xingbie,'年龄':nianling})
# print(d1)
# d2=pd.concat([d,d1])
# print(d2)

# ### 重置index            表.reset_index(drop=True)
# d3 = d2.reset_index(drop=True)      #新增index,drop =True 删除原来的index,并返回一张新表
# print(d3)
####   单列增加     表名['列名']=[数据1，数据2，数据3，数据4]
# d['身高'] =[160,170,180,159,200]
# d['国籍']=['zg','zg','zg','zg','zg']
# print(d)

###  多列增加   pd.merge(表1，表2，how='inner',on = '学号')
# xuehao = ['U001','U002','U003','U004']
# shenggao = [106,180,190,159]
# d4= pd.DataFrame({'学号':xuehao,'身高':shenggao})
# print(d4)
# d5 =pd.merge(d,d4,how='left',on='学号')
# print(d5)

### 定位行列坐标(values) 增加/修改     表名.loc[标签，'列名'] = 数据  在原表中增加新行新列，并在新行新列增加新数据，其他用none 来填充
# d.loc[6,'姓名']= '小胡'
# print(d)

 ### 删/可以删除行或者列    表名.drop(index=[标签1，标签2，。。。。，标签n] ,columns=[列名1，列名2，列名n])
# t = d.drop(index=[4,3] )  #,columns=['性别','年龄'])
# print(t)

##删除空值   d.dropna(axis = 0)     axis=0 表示删除行的空值，  axis = 1 删除列的空值  返回新表
# r=d.dropna(axis = 0)
# print(r)


##访问  1/8
# 整行访问   d.loc[行标签]   返回series对象
# a= d.loc[0]
# print(a)

## 整列的访问  d[列名]
# b=d['学号']
# print(b)
###访问指定值  (定行定列)
# y=d.loc[行标签,'列']
# f行的age改为1.5
# d.loc['f', 'age'] = 1.5

###访问 DataFraame
# 访问多列
# d[[列名1,列名2,....]]
#v=d[[:'学号':'性别']]
# v=d[['学号','性别']]
# print(v)
# 访问多行
# p=d.loc[[1,2]]
# print(p)
#切片
# d.loc[行开始位置：行结束位置,列开始位置：列结束位置]
# d.loc[0:2,'学号':'姓名']

#转置  d.T   (行列转换)
# b=d.T
# print(b)

###筛选
#  d[d[列名]进行判断 ==,< ,>]
# n=d['年龄']>18    #帅选年龄大于18的信息 ，返回的是一个series对象，内容为布尔值
# print(n)
# m=d[n]
# print(m)
# 筛选为性别为男的
# l=d['性别'=='男']
# print(l)
# k=d[d[l]]
# print(k )
### 取出age在2,4间的行（不含）
# df[(df['age']>2) & (df['age']<4)]
# 方法二
#df[df['age'].between(2, 4)]

# 逻辑运算 &  |   多条件判断
# x=(d['性别']=='男')&(d['年龄']>=18)
# x1=d[x]
# print(x1)
###替换  将animal列中的snake替换为python
# df['animal'] = df['animal'].replace('snake', 'python')

###统计常用函数
# 快速统计       d.describe()   只可查看数值型数
# re=d.describe()
# print(re)

#查看前几行        尾几行/ d.tail(行数)
# r=d.head(1)
# print(r)
#查看列的类型      d.info()

###平均值         DataFram      d.mean()
# mean_=d.mean()    # 填入  axis=0 为列/1为行
# print(mean_)
#对列求平均值    d[].mean()
# r=d['年龄'].mean()
# print(r)
#对行求平均值   d.loc[标签].mean()   应该全为数值型
##求和        d.sum()    对列  axis=0 /1为行
###对某列求和     d[列名].sum()
# 对某行求和      d.loc[行标签].sum()

####  分组   d.groupby(['列名]')['要聚合计算的列名'].聚合函数()
# xuehao = ['U001', 'U002', 'U003', 'U004', 'U005', 'V001', 'V002', 'V003', 'V004']
# xingming = ['张三', '李四', '王五', '小明', '小花', '王二小', '王小二', '二小王', '小二王']
# xingbie = ['男', '男', '男', '女', '女', '男', '女', '女', None]
# nianling = [16, 18, 19, 19, 17, 18, 18, 18, 18]
# lingyongqian = [None, 1000, 500, 50, 30, 10, 400, 800, 600]
# df = pd.DataFrame({'学号': xuehao, '姓名': xingming, '性别': xingbie, '年龄': nianling, '零用钱': lingyongqian})
# print(df)
###统计不同性别的年龄求和
# sum_=df.groupby(['性别'])['年龄'].sum()
# print(sum_)
## 不同年龄的人数统计
# count_=df.groupby(['年龄'])['姓名'].count()
# print(count_)
####时间处理   转化为时间   pd.to_datetime(压转化的对象)
# time='2021-01-02'
# datetime_=pd.to_datetime(time)
# print(datetime_)
xuehao = ['U001', 'U002', 'U003', 'U004', 'U005', 'V001', 'V002', 'V003', 'V004']
xingming = ['张三', '李四', '王五', '小明', '小花', '王二小', '王小二', '二小王', '小二王']
xingbie = ['男', '男', '男', '女', '女', '男', '女', '女', None]
nianling = [16, 18, 19, 19, 17, 18, 18, 18, 18]
lingyongqian = [None, 1000, 500, 50, 30, 10, 400, 800, 600]
chusheng = ['2006-01-08', '2004-01-08', '2003-01-08', '2003-01-08', '2005-01-08', '2004-01-08', '2004-01-08',
            '2004-01-08', '2004-01-08']
df = pd.DataFrame({'学号': xuehao, '姓名': xingming, '性别': xingbie, '年龄': nianling, '零用钱': lingyongqian, '出生': chusheng})
print(df.info())
birth=pd.to_datetime(df['出生'])   #series  的值是 datatime类型
print(birth)
df['出生']=birth
print(df)
###生成时间      pd.date_range('开始时间','结束时间','需要多少个时间','时间间隔')
# a=pd.date_range('2001-01-01','2022-12-31',1000)  #默认间隔为天
# print(a)
# b=pd.date_range('2001-01-01','2022-12-31',freq='H')  #设置时间的间隔
# print(b)
    ###提取 年 月 日
    df1=df['出生'].dt.year          # month  day  hour  minute  second
    df['年']=df1
    print(df)



####读取文件 excel
# pd.read_excel(r'文件路径\文件名称.xlsx')
# t=pd.read_excel(r'F:\qq\第5章 Excel案例.xlsx') #header=2 选择第几行做表头
# print(t)
###导出 excel
#表名.to_excel(r'文件路径\文件名称.xlsx')
#### .sort_index()       对index排序，默认升序  返回一个新表
# d1= d.sort_index(ascending=False)   #ascending 是设置排序方式，
# d1=df.sort_index(ascending=False)
# print(d1)
##  .sort_index()    #对列名排序
# s=df['学号']
# s1=s.sort_index()
# print(s1)
###   .sort_values()   #对值排序
# df1=df.sort_values(by='年龄')  # by指定对年龄排序
# print(df1)
##  对series排序
# df3=df['年龄'].sort_values(ascending=True)
# print(df3)
